第4章 通用IO
所有执行IO操作的系统调用都以文件描述符来指代打开的文件。 文件描述符是非负整数
每个进程,文件描述符都自成一套。
shell进程默认打开3个文件描述符:0、1、2 程序继承shell文件描述符副本,所以也默认打开。
UNIX I/O模型的显著特点之一:输入/输出的通用性概念。这意味着使用4个同样的系统调用open()、read()、write()、close()可以对所有类型的文件执行I/O操作。
要实现通用I/O,就必须确保每一文件系统和设备驱动程序都实现了相同的I/O系统调用集。
当需要访问文件系统或设备的专有功能时,可以使用ioctl()系统调用,该调用为通用I/O模型之外的专有特性提供了访问接口。
#include <sys/stat.h>
#include <fcntl.h>
//成功返回文件描述符,失败返回-1并将errno置为相应的标志位
int open(const char *pathname, int flags, .../* mode_t mode */);
如果pathname是符号链接,会对其作解引用
flags为位掩码,用于指定文件的访问模式
mode为位掩码,当open()没有指定O_CREAT标志时,可以省略,作用是指定新创建文件的访问权限
新建文件的访问权限:
- 不仅仅依赖于参数mode
- 受进程umask值的影响
- 受父目录的默认访问控制列表(可能存在)的影响
open()调用成功,必须保证其返回值为进程未用文件描述符中数值最小者。可以丽影该特性以特定文件描述符打开某一个文件。
4-3表中常量分为3组:
- 文件访问模式标志:三种在flags参数中不能同时使用,能通过fcntl()的F_GETFL操作检索文件的访问模式
- 文件创建标志:这些标志不能检索,无法修改
- 已打开文件的状态标志:使用fcntl()的F_GETFL和F_SETFL操作可以分别检索和修改这些标志,故又称文件状态标志